Java 类与对象

第四篇关于 Java 的笔记.

1. 类的模版

1
2
3
4
5
6
public/private class 类名{
public/private 数据类型 变量名;
public/private 数据类型 方法名(参数列表){

}
}
  • public 存取与访问不受限制
  • private 只有类自己的方法可以存取和访问

2. 引用类型 VS 原始数据类型

  • “引用” 一个对象的变量称为 “引用类型” 的变量, 有时又简称为 “对象变量
  • 诸如 int, float 之类的变量称为 “原始数据类型“ 的变量.

3. 变量与内存

A.变量与内存的分配

  • 声明一个 对象变量 时, 实际上并没有创建一个对象, 此变量 = null
  • 定义一个 原始类型变量 时, 会马上给其分配内存.
    (对象变量就是指针? 创建之后为 null?)

B. 变量初始化

  • 任何变量在使用之前都必须初始化
  • 如果要使用一个对象变量又没办法引用一个真实的对象, 就必须声明为 null

C. 引用对象后的对象变量

  • 对象变量保存的是对象的内存地址值
  • 当对象不再使用, JVM 会回收对象所占用的内存, 这个过程称为 “垃圾回收” (GC: Garbage Collection)

D. 理解赋值 “=” 的含义

1
2
Myclass obj = new Myclass();
Myclass other = obj;

这里的 “=” 是把 obj 保存的内存地址值赋给 other, 这两个对象变量指向的实际是同一个对象.

E. 独特的对象引用: this

  • 对象中的所有数据字段都是通过 this 指针间接引用的
    (不是很懂. 2017年12月6日 20:31:40)

F. 作为常量的对象变量

1
final Myclass obj = new Myclass();

“常量” 对象不能指向另一个对象, 但可以修改对象, 比如设置它所引用对象的某公有字段值.

G. 对象判等

  • 对于基本类型变量, 通过 “==” 可以判断它们的值是否相等, 比如 int.
  • 对于对象变量, “==” 比较的是这两个对象变量是否引用同一对象. (这就是这两个变量的指针是否相等?)
  • 我们比较两个变量, 通常是希望比较它们的”内容”是否相等. 在 Java 中要比较两个对象的字段值, 可以 “重写(override)” 基类的 equals() 方法.
1
2
3
4
@Override
public boolean equals(Object obj){
return ((foo)obj).Value == this.Value;
}

@Override 指明此方法是 “重写基类的同名方法”, Java 中, 这种以 “@” 打头的标记被称为 “Annotation”

上面重写 equals() 的方法是简化的, 实际中不应该这么写.

  • 自定义 equals() 方法
    除了重写基类的 equals() 方法, 我们也可以 “重载(overload)” equals():
    (重载: 参数类型或者参数个数不同. 此时不用附加 @Override)
1
2
3
public boolean equals(foo obj){
return obj.Value == this.Value;
}

4. 构造函数

A. 特点

  • 部分特点和 C++ 一模一样

    B. 多构造函数

  • 一个类可以有多个构造函数, 多个构造函数之间通过参数来区分
  • 构造函数之间可以互相调用

C. 类的初始化块

  • 可以在类中使用 “{“ 和 “}” 将语句包围起来, 这部分称为类的初始化块, 里面的语句通常用来初始化类的属性
  • 调用顺序: 从上往下执行初始化语句, 然后执行构造函数里面的语句.
  • 初始化块适合封装那些 “对象创建时必须执行的代码”
  • 创建子类对象会导致基类初始化块的执行

5. 类的静态字段

A. 访问

  • 可以通过对象名和类名作为前缀访问静态数据
  • 推荐使用类名来直接访问静态字段(因为静态字段不属于任何一个对象)

B. 初始化

  • 静态初始化块只会执行一次, 并且优先于一般的初始化
  • 创建子类型对象时, 也会导致父类型的静态初始化块的执行

C. 访问权限

类的静态方法只能访问类的静态成员.

6. 包装类

A. 含义

  • 基本数据类型仅仅提供了数据, 却缺少一些常用的功能, 为此, Java 提供了包装类.
    • 包装类 = 基本数据类型的数据 + 扩充的一些方法和字段
  • 包装类是引用类型, 可以创建相应的对象.

B. Java 中的包装类

  • byte -> Byte
  • short ->Short
  • int ->Int
  • long ->Long
  • char ->Char
  • float ->Float
  • double ->Double
  • boolean ->Boolean

C. 使用

1
2
Integer obj = new Integer(100);
int value = obj.intValue();

D. 装箱和拆箱

1
2
3
int Value = 100;
Integer obj = value; //装箱
int result = obj*2; //拆箱

//不懂